Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 << zurück
Visual C# 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2005

Visual C# 2005
1.320 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-586-X
gp Kapitel 18 Menü-, Symbol- und Statusleiste
  gp 18.1 Das Steuerelement »ToolStripContainer«
  gp 18.2 Bereitstellen eines Menüs
    gp 18.2.1 Die Hierarchie der Menüklassen
    gp 18.2.2 Das Erzeugen eines Menüs
    gp 18.2.3 Die Eigenschaften der Menüelemente »ToolStripMenuItem«
    gp 18.2.4 »ToolStripComboBox« und »ToolStripTextBox«
    gp 18.2.5 Ereignisse
    gp 18.2.6 Beispielprogramm
  gp 18.3 Kontextmenüs
    gp 18.3.1 Das Standardverhalten eines Kontextmenüs ändern
    gp 18.3.2 Ereignisse des Kontextmenüs
    gp 18.3.3 Das Kontextmenü einer Textbox
  gp 18.4 Die Zwischenablage
    gp 18.4.1 Speichern und Abrufen von Daten aus der Zwischenablage
    gp 18.4.2 Andere Methoden, um Daten in die Zwischenablage zu schreiben und abzurufen
    gp 18.4.3 Mehrere Datenformate in der Zwischenablage
    gp 18.4.4 Eigene Datenformate in die Zwischenablage schreiben
    gp 18.4.5 Beispielprogramm – das Menü »Bearbeiten«
  gp 18.5 Die Symbolleiste
    gp 18.5.1 Die Eigenschaften der Symbolleistenschaltflächen
    gp 18.5.2 Drop-down-Buttons in Symbolleisten
    gp 18.5.3 Ein Zwitter vom Typ »ToolStripSplitButton«
    gp 18.5.4 Comboboxen in Symbolleisten
    gp 18.5.5 Textboxen in Symbolleisten
    gp 18.5.6 Fortschrittsbalken (ProgressBar)
    gp 18.5.7 Die Ereignisse der Symbolleiste programmieren
    gp 18.5.8 Beispiel einer komplexeren Symbolleiste
  gp 18.6 Die Statusleiste
    gp 18.6.1 Eine Statusleiste bereitstellen
    gp 18.6.2 Die in der Statusleiste integrierten Steuerelemente


Galileo Computing

18.5 Die Symbolleiste  downtop

Wenden wir uns nun der Gestaltung einer Symbolleiste zu, die auf der Klasse ToolStrip basiert. Eine Symbolleiste enthält eine Reihe von Schaltflächen, die ein schnelles Ausführen der wichtigsten Anwendungsfunktionen ermöglichen. Dabei ist eine Symbolleiste nicht nur auf Schaltflächen beschränkt, sondern kann auch andere Elemente haben. In der folgenden Tabelle sind alle von ToolStrip unterstützten Steuerelemente aufgeführt.


Tabelle 18.5   Die Steuerelemente einer Symbolleiste

ToolStrip-Steuerelement Beschreibung
Button (Klasse: ToolStripButton) Hierbei handelt es sich um eine gewöhnliche Schaltfläche, die auf Klicken des Anwenders reagiert. Die Schaltfläche kann als An-/Aus-Schaltfläche dargestellt werden, die vertieft angezeigt wird, wenn darauf geklickt wird. Diese Darstellung bleibt so lange erhalten, bis erneut auf die Schaltfläche geklickt wird.
Label (Klasse: ToolStripLabel) Zeigt eine Beschriftung in der Symbolleiste an.
DropDownButton (Klasse: ToolStripDropDownButton) Ein Drop-down-Steuerelement, in dem ein Menü oder ein anderes Fenster angezeigt wird, wenn auf das Steuerelement geklickt wird.
SplitButton (Klasse: ToolStripSplitButton) Hierbei handelt es sich um eine Kombination aus einer gewöhnlichen Schaltfläche und einem Drop-down-Button.
Separator (Klasse: ToolStripSeparator) Dieses Steuerelement wird dazu verwendet, Symbolleistenelemente optisch zu gruppieren. Es wird als senkrechter Strich angezeigt.
ComboBox (Klasse: ToolStripComboBox) Zeigt ein fest in der Symbolleiste verankertes Kombinationslistenfeld an.
TextBox (Klasse: ToolStripTextBox) Zeigt eine fest in der Symbolleiste verankerte Textbox an.
Progressbar (Klasse: ToolStripProgressBar) Zeigt einen fest in der Symbolleiste verankerten Fortschrittsbalken an.

Wie es kaum anders sein könnte, werden alle zu einem ToolStrip-Objekt gehörenden Steuerelemente in einer Auflistung verwaltet. Diese ist vom Typ ToolStripItemCollection. Die Referenz darauf liefert die Eigenschaft Items. Natürlich können Sie eine komplette Symbolleiste auch mittels Programmcode erzeugen. Die Methoden, um Steuerelemente der Auflistung hinzuzufügen, sind hinreichend bekannt und gleichen denen einer ArrayList.

Am schnellsten kommen Sie zu exzellenten Ergebnissen mit den Möglichkeiten, die Ihnen Visual Studio 2005 bietet. Klicken Sie auf die Eigenschaft Items im Eigenschaftsfenster des ToolStrip-Objekts, und öffnen Sie den für diesen Zweck bereitgestellten Assistenten. Mit dessen Unterstützung können Sie praktisch vollständig die Symbolleiste entwickeln. Es handelt sich hierbei um den Elementauflistungs-Editor, den Sie schon weiter oben im Einsatz erlebt haben (siehe Abbildung 18.3). Ebenso gut können Sie auch im Forms-Designer die Symbolleiste entwickeln oder im Fußbereich des Eigenschaftsfensters den Link Standardelemente einfügen anklicken. Letzterer generiert eine Symbolleiste mit den üblichsten Schaltflächen.

Sie sehen, vom Handling bei der Entwicklung unterscheiden sich Menü und Symbolleiste in keiner Weise.

Die Ausrichtung der Symbolleistenelemente im Container

Ist die Symbolleiste breiter als die zur Verfügung stehende Breite der Form, ist das Verhalten per Vorgabe ein wenig anders als das der Menüleiste. Während Menüelemente rechts »verschwinden«, wird für nicht mehr Symbolleistenelemente rechts eine Drop-down-Schaltfläche angezeigt, die beim Anklicken alle nicht sichtbaren Elemente anbietet.

Dieses Verhalten stellt die Eigenschaft LayoutStyle mit der Einstellung HorizontalStackWithOverflow sicher. Flow würde dafür sorgen, die Symbolleiste umzubrechen.


Galileo Computing

18.5.1 Die Eigenschaften der Symbolleistenschaltflächen  downtop

Symbolleistenschaltflächen vom Typ ToolStripButton werden angeklickt und führen daraufhin eine bestimmte Aktion aus. Sie weisen in der Regel ein typisches Bildchen auf, damit der Anwender sehr schnell eine bestimmte Funktionalität identifizieren kann. Das Bildchen ordnen Sie über die Eigenschaft Image zu. Per Vorgabe werden die Symbole in einer Größe von 16 x 16 Pixel dargestellt. Wünschen Sie eine andere Darstellungsgröße, stellen Sie diese in der Eigenschaft ImageScalingSize des ToolStrip-Objekts ein.

Soll die Schaltfläche über das Bild hinaus auch eine Beschriftung haben, tragen Sie diese in Text ein. Allerdings ist es nicht so, dass sofort Bildchen und Beschriftung angezeigt werden. Dazu müssen Sie zuerst der Eigenschaft DisplayStyle=ImageAndText zuordnen, denn die Vorgabe lautet nur Image.

Mit ImageAlign und TextAlign richten Sie Text und Bild auf der Schaltfläche aus. Zur relativen Zuordnung von Text und Bild dient die Eigenschaft TextImageRelation. Nehmen Sie keine Änderungen vor, sehen Sie links das Bildchen und rechts daneben den Text. Sie können aber die auch die Positionen tauschen oder das Bild über oder unter dem Text anzeigen lassen.

Weiter oben haben Sie erfahren, dass mit der Eigenschaft AllowItemRecorder=true dem Benutzer die Möglichkeit gegeben wird, Menüelemente mit der Maus bei gedrückter (Alt)-Taste beliebig anzuordnen. Das ist auch bei der Symbolleiste möglich.

Manche Symbolleistenschaltflächen ähneln in der Wirkungsweise den Checkboxen, andere erinnern an eine Gruppierung von Radiobuttons. In Abbildung 18.10, die einen Ausschnitt der Microsoft Word-Symbolleiste zeigt, ist das zu sehen.

Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 18.10   Ausschnitt aus einer Symbolleiste von Microsoft Word

Um Text fett, kursiv oder unterstrichen darzustellen, werden Schaltflächen eingesetzt, die bei jedem Anklicken ihren Zustand verändern. Diese agieren wie Checkboxen, sind also entweder an oder aus. Um Text am Rand eines Dokuments auszurichten, stehen vier Schaltflächen zur Verfügung, die direkt voneinander abhängig sind. Nur eine der Schaltflächen kann aktiviert sein. Schaltflächen dieser Art verhalten sich wie Radiobuttons.

Um auch eine optische Abgrenzung dieser beiden in sich doch sehr unterschiedlichen Verhaltensweisen dem Anwender anzuzeigen, sind beide Gruppen durch senkrechte Striche, die Separatoren, voneinander und von anderen Schaltflächen abgegrenzt. Solche Separatoren werden als eigene Klasse von .NET 2.0 angeboten, nämlich ToolStripSeparator.

Eine Symbolleistenschaltfläche mit checkboxähnlichem Verhalten bereitzustellen, ist sehr einfach. Sie brauchen dazu nur die Eigenschaft CheckOnClick=true einzustellen und die Eigenschaft Checked auszuwerten, die entweder true oder false ist. Der eingedrückte Zustand entspricht der Einstellung true. Die Auswertung des aktuellen Zustands können Sie im Click-Ereignis vornehmen, es bietet sich aber auch CheckedChanged an. Beide Ereignisse werden ausgelöst, nachdem sich der Zustand der Schaltfläche geändert hat.


private void tsButton_CheckedChanged(object sender, EventArgs e) {
  if (tsButton.Checked == true)
    // Anweisungen
  else if (tsButton.Checked == false)
    // Anweisungen
}

Nicht immer kann ein Zustand eindeutig als wahr oder falsch angesehen werden. Das beste Beispiel dafür ist die linke Schaltfläche für fette Schrift in Abbildung 18.10. Ist der markierte Text sowohl fett als auch »normal«, gibt es einen dritten Zustand. Für solche Fälle dient die Eigenschaft CheckState, die Checked, Unchecked oder Indeterminate annehmen kann. Indeterminate beschreibt hierbei den nicht eindeutig definierbaren Zustand.

Und was ist, wenn sich drei Symbolleistenschaltflächen in einer Gruppe befinden, wobei sich die Schaltflächen wie Radiobuttons verhalten sollen, also zu jedem Zeitpunkt nur einer ausgewählt sein darf? Was im ersten Moment vielleicht recht schwierig aussieht, ist recht einfach zu lösen. Angenommen, die drei Symbolleistenschaltflächen heißen tsButton1, tsButton2 und tsButton3, so könnte die Lösung wie im folgenden Programmcode zu sehen sein:


private void tsButton1_Click(object sender, EventArgs e) {
  if (tsButton1.Checked) {
    tsButton2.Checked = false;
    tsButton3.Checked = false;
  }
  else
    tsButton2.Checked = true;
}
private void tsButton2_Click(object sender, EventArgs e) {
  if (tsButton2.Checked) {
    tsButton1.Checked = false;
    tsButton3.Checked = false;
  }
  else
    tsButton3.Checked = true;
}
private void tsButton3_Click(object sender, EventArgs e) {
  if (tsButton3.Checked) {
    tsButton1.Checked = false;
    tsButton2.Checked = false;
  }
  else
    tsButton1.Checked = true;
}

Dieser Code spiegelt das Verhalten der Schaltflächen zur Textausrichtung unter MS Word wider. Klicken Sie hier auf eine aktuell Symbolleistenschaltfläche, wird die angeklickte deaktiviert und die in der Reihenfolge nächste ausgewählt.

Weniger aufwändig wäre der Weg, wenn das Visual Studio Control-Array direkt unterstützen würde. Dann könnte mit dem Index der Elemente jongliert werden. Leider bietet aber Visual Studio diese Unterstützung nicht an, so dass dieser Lösungsweg ausscheidet. Sie könnten selbstverständlich auch mittels Code ein Array von ToolStripButton-Objekten erzeugen und der Auflistung des ToolStrip-Controls hinzufügen. Nur ist dieser Aufwand größer als der, den wir oben für die drei Schaltflächen betreiben mussten.


Galileo Computing

18.5.2 Drop-down-Buttons in Symbolleisten  downtop

Eine Drop-down-Schaltfläche unterscheidet sich von den vorher besprochenen Symbolleistenschaltflächen dadurch, dass sie nach dem Klicken ein Untermenü öffnet. Schaltflächen dieses Typs basieren auf der Klasse ToolStripDropDownButton. Die Menüelemente sind vom Typ ToolStripMenuItem und haben deshalb dieselben Fähigkeiten wie alle anderen Menüelemente. Eine genaue Beschreibung an dieser Stelle erübrigt sich daher auch.

Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 18.11   Symbolleiste mit einer Drop-down-Schaltfläche


Galileo Computing

18.5.3 Ein Zwitter vom Typ »ToolStripSplitButton«  downtop

ToolStripSplitButton-Objekte stellen eine Kombination aus ToolStripButton und ToolStripDropDownButton dar. Klickt man auf den linken Teil der Schaltfläche, wird das Click-Ereignis ausgeführt, klickt man auf den rechten Teil mit dem Pfeil, öffnet sich ein Untermenü, das Sie im Forms-Designer zusammenstellen können, oder man nimmt den Weg über den bekannten Assistenten, zu dem Sie Zugang über die Eigenschaft DropDownItems haben.


Galileo Computing

18.5.4 Comboboxen in Symbolleisten  downtop

In vielen Anwendungen sind Comboboxen zu einem wichtigen Element in der Symbolleiste geworden. Das ToolStrip-Steuerelement ermöglicht nun endlich auch unter NET, dieses Feature in die eigene Anwendung einzubauen. Diese Kombinationslistenfelder sind vom Typ ToolStripComboBox.

Zur individuellen Anpassung der Darstellung steht neben BackColor, ForeColor und Font auch die Eigenschaft FlatStyle zur Verfügung, welche die Werte Flat, Popup, Standard und System annehmen kann.

Die Elemente, die Sie beim Öffnen dem Benutzer anbieten wollen, tragen Sie in eine Auflistung ein, deren Referenz die Eigenschaft Items bereitstellt. Mit Sorted können alle Einträge sortiert werden.

Mit der Eigenschaft DropDownStyle legen Sie fest, wie die Liste angezeigt wird und ob der Anwender zur Laufzeit selbst im Textfeld Einträge vornehmen kann. Der Standard ist auf DropDown festgesetzt. Damit wird dem Anwender eine Eingabe ermöglicht, während DropDownList ihm das verwehrt. Die dritte Auswahlmöglichkeit, Simple, ist eine Kombination aus Textbox und Listenfeld, welche die Höhe der Symbolleiste nachhaltig optisch negativ beeinflusst und deshalb auch keine wirkliche Auswahlalternative darstellt.

Damit direkt nach dem Anwendungsstart keine leere Combobox angezeigt wird, sollten Sie mit SelectedIndex oder SelectedItem ein Startelement festlegen., z.B.:


toolStripComboBox1.SelectedIndex = 0;

Dazu bietet sich der Konstruktor der Form (nach InitializeComponent) oder das Load-Ereignis der Form an.

Hat der Benutzer sich für ein Element aus der Liste entschieden, können Sie dieses unter anderem durch Auswerten der Eigenschaft Text erhalten. Für die Auswertung ist aber das Ereignis Click denkbar ungeeignet, da es ausgelöst wird, sobald auf das Kombinationslistenfeld geklickt wird. In diesem Fall sollten Sie den erforderlichen Programmcode im Ereignishandler von SelectedIndexChanged implementieren.


Galileo Computing

18.5.5 Textboxen in Symbolleisten  downtop

Einfache Textinformationen können Sie in einer Symbolleiste bereitstellen, wenn Sie sich für das angebotene ToolStripLabel entscheiden. Möchten Sie dem Anwender jedoch die Möglichkeit geben, selbst eine Zeichenfolge einzutragen, ist ein ToolStripTextBox-Element gefragt. Auch wenn Ihnen die Eigenschaft Lines suggeriert, es handle sich um eine Textbox, die mehrere Zeilen zulässt, tatsächlich wird nur eine angezeigt, die durch die Eigenschaft Text beschrieben wird.

Symbolleistentextboxen unterstützen die Autovervollständigung und weitere Eigenschaften, die auch eine herkömmliche TextBox hat. Dieser hatten wir uns in Kapitel 16 gewidmet und werden deshalb nicht noch einmal das Gesagte wiederholen. Im Zweifelsfall lesen Sie dort bitte noch einmal nach.


Galileo Computing

18.5.6 Fortschrittsbalken (ProgressBar)  downtop

Zu guter Letzt können Sie dem Anwender zur Laufzeit auch einen Fortschrittsbalken anbieten, der über den aktuellen Stand einer länger andauernden Operation informiert. Fortschrittsbalken in einer Symbolleiste sind vom Typ ToolStripProgressBar. Die Fähigkeiten sind praktisch identisch denen eines Objekts vom Typ ProgressBar, dem wir uns im nächsten Kapitel zuwenden.


Galileo Computing

18.5.7 Die Ereignisse der Symbolleiste programmieren  downtop

Eine Symbolleiste bietet eine Reihe integrierter Steuerelemente an. Viele Steuerelemente reagieren auf das Click-Ereignis, zum Beispiel die übliche Schaltfläche, aber auch ein Label oder eine Drop-down-Schaltfläche. Sie können jedes Ereignis separat programmieren, was gegebenenfalls zu einer sehr großen Zahl von Ereignishandlern führt.

Eine andere, übersichtlichere Lösung wäre ein gemeinsamer Ereignishandler, für alle Click-Ereignisse einer Symbolleiste. Hier hilft uns das ToolStrip-Objekt weiter, das dazu ein passendes Ereignis in ItemClicked bereitstellt. Registrieren Sie bei diesem Event einen Ereignishandler, wird dieser ausgelöst, wenn in der Symbolleiste ein Element angeklickt wird.


public event ToolStripItemClickedEventHandler ItemClicked;

Dem Ereignishandler kommt dann die Aufgabe zu festzustellen, auf welche Schaltfläche der Anwender geklickt hat. Der zweite Parameter des Handlers vom Typ ToolStripItemClickedEventArgs stellt zu diesem Zweck eine Eigenschaft mit der passenden Information zur Verfügung: Es handelt sich um dessen Eigenschaft ClickedItem.


public ToolStripItem ClickedItem {get;}

Da der Ereignishandler alle Click-Ereignisse einer Symbolleiste behandelt, müssen wir über die Eigenschaft ClickedItem zuerst herausfinden, welcher Komponente das ausgelöste Ereignis zugeordnet werden muss, um dann entsprechend zu reagieren. Eine Möglichkeit wäre es, den Index der geklickten Schaltfläche in der Auflistung festzustellen und die entsprechende Programmreaktion in Abhängigkeit vom Index zu setzen.


private void toolStrip1_ItemClicked(object sender,                    ToolStripItemClickedEventArgs e) {
  switch (toolStrip1.Items.IndexOf(e.ClickedItem)) {
    case 0:
      MessageBox.Show("Erste Schaltfläche angeklickt.");
      break;
    case 1:
      MessageBox.Show("Zweite Schaltfläche angeklickt.");
      break;
    ...
  }
}

Diese Lösung hat aber einen Nachteil, wenn sich die Indizes der Schaltflächen zur Laufzeit ändern. Das könnte beispielsweise der Fall sein, wenn Sie dem Anwender einräumen, die Struktur der Symbolleiste zur Laufzeit zu ändern. Es stimmt dann die feste Zuordnung zwischen Schaltfläche und Index nicht mehr, die bei unserem Codefragment eine unabdingbare Voraussetzung ist.

Ein flexibler Lösungsansatz geht daher einen anderen Weg, um die angeklickte Symbolleistenschaltfläche zu identifizieren. Dieser Ansatz nutzt die Eigenschaft Tag des Symbolleistenelements. In der Tag-Eigenschaft, über die auch andere Steuerelemente verfügen, können beliebige Informationen gespeichert werden, die der Entwickler im Bedarfsfall nach eigenen Vorstellungen nutzen kann.


public object Tag {get; set;}

In unserem konkreten Fall könnten wir der Tag-Eigenschaft jeder Symbolleistenschaltfläche eine in der Auflistung eindeutige Zeichenfolge übergeben, die wir in einer switch-Anweisung identifizieren.


private void toolStrip1_ItemClicked(object sender,                    ToolStripItemClickedEventArgs e) {
  switch (e.ClickedItem.Tag.ToString()) {
    case "Open":
      MessageBox.Show("Erste Schaltfläche angeklickt.");
      break;
    case "New":
      MessageBox.Show("Zweite Schaltfläche angeklickt.");
      break;
    ...
  }
}


Galileo Computing

18.5.8 Beispiel einer komplexeren Symbolleiste  toptop

Das folgende Beispiel DropDownButtons enthält in der Symbolleiste sowohl Umschaltflächen als auch eine Drop-down-Schaltfläche mit dem Bezeichner colorButton. Damit kann der Text einer formfüllenden Textbox entweder fett, kursiv, unterstrichen oder in einer anderen Schriftfarbe dargestellt werden. Eine DropDownButton-Symbolleistenschaltfläche zeigt dabei immer die aktuell gewählte Schriftfarbe als quadratisches Symbol an und passt sich gegebenenfalls auch Änderungen an.


// --------------------------------------------------------------
// Beispiel: ...\Kapitel 18\DropDownButtons
// --------------------------------------------------------------
public partial class Form1 : Form {
  FontStyle fontstyle = FontStyle.Regular;
  ToolStripMenuItem[] menuArr;
  public Form1() {
    InitializeComponent()
    // DropDown-Menüelemente in ein Array schreiben
    menuArr = new ToolStripMenuItem[] { menuRot, menuGelb, menuBlau };
    // Initialisierung der Anzeige
    this.menuRot_Click(menuRot, null);
    textBox.SelectionStart = textBox.Text.Length;
  }
  // Festlegen des Schriftstils
  private void toolStrip1_ItemClicked(object sender, 
                      ToolStripItemClickedEventArgs e) {
    if (e.ClickedItem.Tag != null) {
      switch ((string)(e.ClickedItem.Tag)) {
        case "Bold":
          fontstyle ^= FontStyle.Bold;
          break;
        case "Italic":
          fontstyle ^= FontStyle.Italic;
          break;
        case "Underline":
          fontstyle ^= FontStyle.Underline;
          break;
      }
      textBox.Font = new Font(textBox.Font, fontstyle);
    }
  }
  private void SetFontColor(ToolStripItem button, Color color) {
    Bitmap bmp = new Bitmap(16, 16);
    Graphics graph = Graphics.FromImage(bmp);
    // füllt Bitmap mit der neuen Farbe
    graph.Clear(color);
    // Bitmap der Eigenschaft Image zuweisen
    tlbColorDropDown.Image = bmp;
    // Setzen der Textfarbe in der Textbox
    textBox.ForeColor = color;
  }
  private void menuRot_Click(object sender, EventArgs e) {
    SetFontColor(this.toolStrip1.Items["menuRot"], Color.Red);
    this.SetChecked(sender);
  }
  private void menuBlau_Click(object sender, EventArgs e) {
    SetFontColor(this.toolStrip1.Items["menuBlau"], Color.Blue);
    this.SetChecked(sender);
  }
  private void menuGelb_Click(object sender, EventArgs e) {
    SetFontColor(this.toolStrip1.Items["menuGelb"], Color.Yellow);
    this.SetChecked(sender);
  }
  // Setzen des Auswahlhäkchens
  private void SetChecked(object sender) {
    if (menuArr != null) {
      foreach (ToolStripMenuItem menu in menuArr)
        menu.Checked = false;
      ((ToolStripMenuItem)sender).Checked = true;
    }
  }
}

Betrachten wir zuerst die drei Symbolleistenschaltflächen, mit denen der Schriftstil Fett, Kursiv und Unterstrichen eingestellt werden kann. Es bietet sich an, im Ereignishandler von ItemClicked zu prüfen, ob eine Schaltfläche in der Symbolleiste angeklickt worden ist, die für die Umschaltung einer der genannten Schriftstile verantwortlich ist. Im switch-Satetment wird dazu die Tag-Eigenschaft ausgewertet.

Da durch den Typ FontStyle eine Bitkombination beschrieben wird, müssen wir nur das entsprechende Bit, das Auskunft über fette, kursive oder unterstrichene Darstellung einer Schrift gibt, bei jedem Klick auf die zugeordnete Schaltfläche invertieren. Dazu bietet sich der »^«-Operator an. Bei der Schaltfläche zum Umstellen auf fette bzw. nicht fette Darstellung sieht die Anweisung dazu wie folgt aus:


fontstyle ^= FontStyle.Bold;

Die Menüelemente menuRot, menuGelb und menuBlau der Drop-down-Schaltfläche werden im Array menuArr vom Typ ToolStripMenuItem verwaltet, das auf Klassenebene deklariert und im Konstruktor initialisiert wird. Wir erleichtern uns damit den Zugriff auf die Menüelemente, wenn das Auswahlhäkchen gesetzt wird, um die gewählte Schriftfarbe auch optisch hervorzuheben. Diese Aufgabe übernimmt die Methode SetChecked.

Um dem Anwender die aktuelle Farbwahl durch ein farblich angepasstes Bildchen in der Symbolleiste anzuzeigen, müssen wir in wenig in die Trickkiste greifen.

Jeder Klick auf eines der drei Menüelemente löst ein Ereignis aus. Im zugeordneten Ereignishandler wird die Methode SetFontColor aufgerufen und dabei die Referenz auf die Symbolleistenschaltfläche und die gewählte Farbe übergeben, z.B.:


SetFontColor(this.toolStrip1.Items["menuRot"], Color.Red); 

Jedes Bildchen der Symbolleiste basiert auf einer Bitmap. In SetFontColor wird daher zuerst mit


Bitmap bmp = new Bitmap(16, 16);

ein Objekt dieses Typs in der Größe 16 x 16 Pixel neu erzeugt. Um grafische Operationen ausführen zu können, benötigen wir die Referenz auf das Graphics-Objekt dieser Bitmap:


Graphics graph = Graphics.FromImage(bmp);

Danach legen wir die Hintergrundfarbe mit


graph.Clear(color);

fest. Das neue Bitmap ist damit fertig. Wir übergeben nur noch dessen Referenz der Eigenschaft Image des ToolStripDropDownButton-Objekts und haben das gesetzte Ziel erreicht:


tlbColorDropDown.Image = bmp;

 << zurück
  
  Zum Katalog
Zum Katalog: Visual C# 2005
Visual C# 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Visual Basic 2005






 Visual Basic 2005


Zum Katalog: Java ist auch eine Insel






 Java ist auch eine
 Insel


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de